﻿using KinonekoSoftware.CodariaDB.Documents.DataParts;

using KinonekoSoftware.CodariaDB.Documents.Relationships;

namespace KinonekoSoftware.CodariaDB.Runtimes
{
    partial class RepositoryRuntime
    {
        private ConceptSystem ConceptSystem => _lazy_Concept.Value;

        private void InitializeMessageHandlers()
        {
            _queue.Interest<ConceptOP_MSG>(Handle_ConceptOP_MSG);
            _queue.Interest<RemoveOP_InstanceCacheMSG>(Handle_RemoveOP_MSG);
            _queue.Interest<Factory_MSG>(Handle_Assemble_MSG);
        }

        private void Handle_ConceptOP_MSG(DB_MSG msg)
        {
            if (msg is not ConceptOP_MSG cem)
            {
                return;
            }

            ConceptSystem.Accept(cem);
        }
        
        private void Handle_RemoveOP_MSG(DB_MSG msg)
        {
            var removeMSG = (RemoveOP_InstanceCacheMSG)msg;

            //
            //
            GetEngine<CompositeEngine>().RemoveBirthday(removeMSG.Id);
            
            //
            //
            // GetEngine<PartEngine>().RemoveParts(removeMSG.Id);
            
            //
            //
            GetEngine<RelationEngine>().RemoveCharacterRelationships(removeMSG.Id);
        }

        private void Handle_Assemble_MSG(DB_MSG msg)
        {
            var assembleMSG = (Factory_MSG)msg;

            if (_InstanceAssemblyFactory.TryGetValue(msg.GetType(), out var factory))
            {
                factory.Assembly(assembleMSG);
            }
        }
    }
}